home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
SendText.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
10KB
|
604 lines
/*
** SendText.c
**
** Text sending support routines
**
** Copyright © 1990-1996 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
/* MatchPrompt():
*
* Search incoming data stream for a match.
*/
BOOL
MatchPrompt(STRPTR Data,LONG Size,STRPTR Prompt,LONG PromptLen)
{
STATIC LONG WaitCount,PromptCount;
if(!Data)
WaitCount = PromptCount = 0;
else
{
UBYTE c,Mask;
if(Config->SerialConfig->StripBit8)
Mask = 0x7F;
else
Mask = 0xFF;
do
{
if(c = ((*Data++) & Mask))
{
BOOL MatchMade;
do
{
MatchMade = FALSE;
if(PromptCount == WaitCount)
{
if(c == Prompt[WaitCount] & Mask)
{
MatchMade = TRUE;
if(PromptLen == ++PromptCount)
return(TRUE);
}
}
if(MatchMade)
WaitCount++;
else
{
if(WaitCount)
{
WaitCount = 0;
PromptCount = 0;
}
else
break;
}
}
while(!WaitCount);
}
}
while(--Size);
}
return(FALSE);
}
/* LocalWaitForPrompt(STRPTR Prompt,LONG PromptLen):
*
* Scan the incoming data flow for a certain string.
*/
STATIC BOOL
LocalWaitForPrompt(STRPTR Prompt,LONG PromptLen)
{
ULONG Signals;
BOOL GotIt;
MatchPrompt(NULL,0,NULL,0);
/* Start the timer. */
StartTime(Config->ClipConfig->SendTimeout / 100,(Config->ClipConfig->SendTimeout % 100) * 10000);
/* Lock the current xOFF state and clear the xOFF flag. */
Lock_xOFF();
Clear_xOFF();
GotIt = FALSE;
/* Loop until the prompt is found or the timer elapses. */
do
{
Signals = (*SerialWaitForData)(SIG_TIMER);
if(Signals & SIG_SERIAL)
{
ULONG Length;
/* Check how much data is available. */
if(Length = (*SerialGetWaiting)())
{
/* Don't read more than the buffer will hold. */
if(Length > SerialBufferSize / 2)
Length = SerialBufferSize / 2;
/* Read the data. */
if(Length = (*SerialRead)(ReadBuffer,Length))
{
/* Got some more data. */
BytesIn += Length;
/* Translate the buffer contents if necessary. */
if(Translate_CR_LF)
Length = (*Translate_CR_LF)(ReadBuffer,Length);
else
Length = 1;
if(Length)
{
ConProcess(ReadBuffer,Length);
/* Check if this is it. */
if(MatchPrompt(ReadBuffer,Length,Prompt,PromptLen))
GotIt = TRUE;
}
}
}
}
/* Stop when the bell rings. */
if(Signals & SIG_TIMER)
break;
}
while(!GotIt);
/* Stop the timer. */
StopTime();
Unlock_xOFF();
return(GotIt);
}
/* SendLinePrompt(STRPTR Line,LONG Len):
*
* Send text line, wait for prompt.
*/
BOOL
SendLinePrompt(STRPTR Line,LONG Len)
{
LONG i;
if(Len == -1)
Len = strlen(Line);
while(Len)
{
i = 0;
while(i < Len && Line[i] != '\r')
i++;
if(Line[i] == '\r')
{
i++;
SerWrite(Line,i);
if(!LocalWaitForPrompt(SendPrompt,SendPromptLen))
return(FALSE);
}
else
{
if(i)
SerWrite(Line,i);
}
Len -= i;
Line += i;
}
return(TRUE);
}
/* SendLineSimple(STRPTR Line,LONG Len):
*
* Send a text line, no fancy features.
*/
BOOL
SendLineSimple(STRPTR Line,LONG Len)
{
if(Len == -1)
Len = strlen(Line);
SerWrite(Line,Len);
return(TRUE);
}
/* SendLineDial(STRPTR Line,LONG Len):
*
* The SendLineSimple for the dialer and init commands.
*/
BOOL
SendLineDial(STRPTR Line,LONG Len)
{
if(Len == -1)
Len = strlen(Line);
if(Config->ModemConfig->CharSendDelay > 0)
{
ULONG Seconds = Config->ModemConfig->CharSendDelay / MILLION,
Micros = Config->ModemConfig->CharSendDelay % MILLION;
while(Len--)
{
SerWrite(Line++,1);
DelayTime(Seconds,Micros);
}
}
else
SerWrite(Line,Len);
return(TRUE);
}
/* SendLineDelay(STRPTR Line,LONG Len):
*
* Send a text line, include a delay where necessary.
*/
BOOL
SendLineDelay(STRPTR Line,LONG Len)
{
if(Len == -1)
Len = strlen(Line);
while(Len--)
{
SerWrite(Line,1);
if(*Line == '\r')
DelayTime(Config->ClipConfig->LineDelay / 100,(Config->ClipConfig->LineDelay % 100) * 10000);
else
DelayTime(Config->ClipConfig->CharDelay / 100,(Config->ClipConfig->CharDelay % 100) * 10000);
Line++;
}
return(TRUE);
}
/* SendLineEcho(STRPTR Line,LONG Len):
*
* Send a text line, wait for single characters to be echoed.
*/
BOOL
SendLineEcho(STRPTR Line,LONG Len)
{
ULONG Signals;
BOOL GotIt;
if(Len == -1)
Len = strlen(Line);
/* Lock the current xOFF state and clear the xOFF flag. */
Lock_xOFF();
Clear_xOFF();
while(Len--)
{
/* Send the next character. */
SerWrite(Line,1);
/* Start the timer. */
StartTime(Config->ClipConfig->SendTimeout / 100,(Config->ClipConfig->SendTimeout % 100) * 10000);
/* Loop until we got the character we wanted or the time elapses. */
GotIt = FALSE;
do
{
Signals = (*SerialWaitForData)(SIG_TIMER);
/* Did we receive new data? */
if(Signals & SIG_SERIAL)
{
/* Is there any character waiting? */
if((*SerialGetWaiting)())
{
/* Read that character. */
if((*SerialRead)(ReadBuffer,1))
{
ULONG Length;
BytesIn++;
/* Check if the character needs translation. */
if(Translate_CR_LF)
Length = (*Translate_CR_LF)(ReadBuffer,1);
else
Length = 1;
if(Length)
ConProcess(ReadBuffer,Length);
/* Is that it? */
if(Length == 1 && ReadBuffer[0] == Line[0])
GotIt = TRUE;
}
}
}
/* Did the bell ring? */
if(Signals & SIG_TIMER)
break;
}
while(!GotIt);
/* Stop the timer. */
StopTime();
/* Check if we got the echo. If not, return an error. */
if(!GotIt)
{
Unlock_xOFF();
return(FALSE);
}
Line++;
}
Unlock_xOFF();
return(TRUE);
}
/* SendLineAnyEcho(STRPTR Line,LONG Len):
*
* Send a text line, wait for characters to be echoed.
*/
BOOL
SendLineAnyEcho(STRPTR Line,LONG Len)
{
ULONG Signals;
BOOL GotIt;
if(Len == -1)
Len = strlen(Line);
/* Lock the current xOFF state and clear the xOFF flag. */
Lock_xOFF();
Clear_xOFF();
while(Len--)
{
/* Send the next character. */
SerWrite(Line,1);
/* Start the timer. */
StartTime(Config->ClipConfig->SendTimeout / 100,(Config->ClipConfig->SendTimeout % 100) * 10000);
/* Loop until we got the character we wanted or the time elapses. */
GotIt = FALSE;
do
{
Signals = (*SerialWaitForData)(SIG_TIMER);
/* Did we receive new data? */
if(Signals & SIG_SERIAL)
{
/* Is there any character waiting? */
if((*SerialGetWaiting)())
{
/* Read that character. */
if((*SerialRead)(ReadBuffer,1))
{
LONG Length;
BytesIn++;
if(Translate_CR_LF)
Length = (*Translate_CR_LF)(ReadBuffer,1);
else
Length = 1;
if(Length)
ConProcess(ReadBuffer,Length);
GotIt = TRUE;
}
}
}
/* Did the bell ring? */
if(Signals & SIG_TIMER)
break;
}
while(!GotIt);
/* Stop the timer. */
StopTime();
/* Check if we got the echo. If not, return an error. */
if(!GotIt)
{
Unlock_xOFF();
return(FALSE);
}
Line++;
}
Unlock_xOFF();
return(TRUE);
}
/* SendLineKeyDelay(STRPTR Line,LONG Len):
*
* Send a text line, include keyboard delay pauses between characters.
*/
BOOL
SendLineKeyDelay(STRPTR Line,LONG Len)
{
struct Preferences Prefs;
if(Len == -1)
Len = strlen(Line);
/* Get current key repeat delay. */
GetPrefs(&Prefs,offsetof(struct Preferences,KeyRptDelay));
/* Any delay specified at all? */
if(Prefs.KeyRptSpeed.tv_secs || Prefs.KeyRptSpeed.tv_micro)
{
while(Len--)
{
SerWrite(Line++,1);
if(Len)
DelayTime(Prefs.KeyRptSpeed.tv_secs,Prefs.KeyRptSpeed.tv_micro);
}
}
else
SerWrite(Line,Len);
return(TRUE);
}
/* ChangeSendLine(SENDLINE NewSendLine):
*
* Change the routine that sends full lines of text.
*/
SENDLINE
ChangeSendLine(SENDLINE NewSendLine)
{
SENDLINE OldSendLine;
OldSendLine = SendLine;
SendLine = NewSendLine;
return(OldSendLine);
}
/* RestoreSendLine():
*
* Restore the SendLine pointer to its original routine.
*/
VOID
RestoreSendLine(SENDLINE ChangedSendLine,SENDLINE OriginalSendLine)
{
if(SendLine == ChangedSendLine)
SendLine = OriginalSendLine;
}
/* SendSetup():
*
* Choose the right routine for the text line output job.
*/
VOID
SendSetup()
{
/* Prepare the prompt string. */
if(Config->ClipConfig->LinePrompt[0])
SendPromptLen = TranslateString(Config->ClipConfig->LinePrompt,SendPrompt);
else
{
SendPrompt[0] = 0;
SendPromptLen = 0;
}
/* Pick the line send routine. */
switch(Config->ClipConfig->PacingMode)
{
case PACE_DIRECT:
SendLine = (SENDLINE)SendLineSimple;
break;
case PACE_ECHO:
if(Config->ClipConfig->SendTimeout)
SendLine = (SENDLINE)SendLineEcho;
else
SendLine = (SENDLINE)SendLineSimple;
break;
case PACE_ANYECHO:
if(Config->ClipConfig->SendTimeout)
SendLine = (SENDLINE)SendLineAnyEcho;
else
SendLine = (SENDLINE)SendLineSimple;
break;
case PACE_PROMPT:
if(Config->ClipConfig->SendTimeout)
SendLine = (SENDLINE)SendLinePrompt;
else
SendLine = (SENDLINE)SendLineSimple;
break;
case PACE_DELAY:
if(Config->ClipConfig->LineDelay || Config->ClipConfig->CharDelay)
SendLine = (SENDLINE)SendLineDelay;
else
SendLine = (SENDLINE)SendLineSimple;
break;
case PACE_KEYBOARD:
SendLine = (SENDLINE)SendLineKeyDelay;
break;
}
}